/***
  7-4 树的遍历 (30 分)
给定一棵二叉树的后序遍历和中序遍历，请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式：
输入第一行给出一个正整数N（≤30），是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式：
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔，行首尾不得有多余空格。

输入样例：
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
结尾无空行
输出样例：
4 1 6 3 5 7 2
结尾无空行
***/
#include "stdio.h"
#include "stdlib.h"
#define N 30
typedef struct biTree
{
    int num;
    struct biTree *lchild, *rchild;
} * BiTree, Node;
BiTree reCreate(int *post, int *in, int len)
{
    Node *p;
    int i;
    if (len <= 0)
        return NULL;
    p = (Node *)malloc(sizeof(Node));
    p->num = post[len - 1];
    i = 0;
    while (in[i] != post[len - 1])
        i++;
    p->lchild = reCreate(post, in, i);
    p->rchild = reCreate(post + i, in + i + 1, len - i - 1);
    return p;
}
void LevelTraversal(BiTree t)
{
    Node *nodes[N + 5];
    int result[N+5];
    int index=-1,i;
    int front, tail;
    front = tail = -1;
    tail++;
    nodes[tail] = t;
    while(front!=tail){
        front++;
        index++;
        result[index]=nodes[front]->num;
        if(nodes[front]->lchild){
            tail++;
            nodes[tail]=nodes[front]->lchild;
        }
        if(nodes[front]->rchild){
            tail++;
            nodes[tail] = nodes[front]->rchild;
        }
    }
    for(i=0;i<=index;i++){
        if(i==index)printf("%d\n",result[i]);
        else printf("%d ",result[i]);
    }
}
int main(int argc, char const *argv[])
{
    int post[N + 5], in[N + 5];
    int n, i;
    BiTree t;
    // freopen("a.txt","r",stdin);
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", post + i);
    for (i = 0; i < n; i++)
        scanf("%d", in + i);
    t = reCreate(post, in, n);
    LevelTraversal(t);
    return 0;
}
